package com.istudy.utils;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * 负责数据库的连接和jdbc对象的关闭
 *
 * @author 徐大大
 * @create 2020-08-18 18:34
 */
public class JDBCUtils {
    private static String url;//connection的url,根据url指定使用哪个类的连接
    private static String user;//connection的user,指定数据库用户名
    private static String password;//connection,
    private static String driver;//驱动参数，指定加载哪个数据库驱动

    /**
     * 初始化字段
     */
    static {
        try {
            //创建Properties集合类。
            Properties properties = new Properties();
            //获取当前类的类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            //根据类加载器获取源文件下的指定字符串的对象
            URL jdbcProperties = classLoader.getResource("jdbc.properties");
            //获取URL对象的路径
            String jdbcPropertiesPath = jdbcProperties.getPath();
            //根据指定路径向properties对象导入文件
            properties.load(new FileReader(jdbcPropertiesPath));


            //初始化connection需要的url参数
            url = properties.getProperty("url");
            //初始化connection需要的user参数
            user = properties.getProperty("user");
            //初始化connection需要的password参数
            password = properties.getProperty("password");
            //初始化加载驱动需要的参数
            driver = properties.getProperty("driver");


            //加载指定的数据库驱动
            Class.forName(driver);
        } catch (IOException e) {
            System.out.println("初始化JDBCUtils字段参数错误");
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            System.out.println("初始化JDBCUtils字段参数错误");
            System.out.println("加载Driver错误");
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     *
     * @return Connection 一个数据库连接对象
     */
    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            System.out.println("获取数据库连接异常");
            e.printStackTrace();
        }
        return connection;
    }


    /**
     * 关闭数据库操作对象
     *
     * @param conn 数据库连接，有就传connection对象。没有就传个null
     * @param stmt 执行sql语句对象，有就传
     * @param rs   结果集对象，执行sql查询语句是返回的对象
     */
    public static void closeAll(Connection conn, Statement stmt, ResultSet rs) {
        // 若结果集对象不为空，则关闭
        try {
            if (rs != null && !rs.isClosed())
                rs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 若Statement对象不为空，则关闭
        try {
            if (stmt != null)
                stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 若数据库连接对象不为空，则关闭
        try {
            if (conn != null && !conn.isClosed())
                conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
